package top.qitun.tian;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
@EnableEurekaClient
@EnableZuulProxy
//@EnableResourceServer
@EnableHystrix
@EnableFeignClients
public class ApiGatewayMsApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayMsApplication.class, args);
    }
    
    @LoadBalanced
    @Bean
    public OAuth2RestTemplate loadBalancedOauth2RestTemplate(
            OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) {
        return new OAuth2RestTemplate(resource, context);
    }
//    @Component
//    public static class MyCommandLineRunner implements CommandLineRunner {
//        @Override
//        public void run(String... args) throws Exception {
//            MonitoringHelper.initMocks();
//            initJavaFilters();
//        }
//
//        private void initJavaFilters() {
//            final FilterRegistry r = FilterRegistry.instance();
//
//            r.put("javaPreFilter", new ZuulFilter() {
//                @Override
//                public int filterOrder() {
//                    return 50000;
//                }
//
//                @Override
//                public String filterType() {
//                    return "pre";
//                }
//
//                @Override
//                public boolean shouldFilter() {
//                    return true;
//                }
//
//                @Override
//                public Object run() {
//                    System.out.println("running javaPreFilter");
//                    RequestContext.getCurrentContext().set("name", "liaokailin");
//                    return null;
//                }
//            });
//
//            r.put("javaRoutingFilter", new ZuulFilter() {
//                @Override
//                public int filterOrder() {
//                    return 50000;
//                }
//
//                @Override
//                public String filterType() {
//                    return "route";
//                }
//
//                @Override
//                public boolean shouldFilter() {
//                    return true;
//                }
//
//                @Override
//                public Object run() {
//                    System.out.println("running javaRoutingFilter");
//                    try {
//                        RequestContext.getCurrentContext().getResponse().sendRedirect("http://blog.csdn.net/liaokailin/");
//                    } catch (IOException e) {
//                        e.printStackTrace();
//                    }
//                    return null;
//                }
//            });
//
//            r.put("javaPostFilter", new ZuulFilter() {
//                @Override
//                public int filterOrder() {
//                    return 50000;
//                }
//
//                @Override
//                public String filterType() {
//                    return "post";
//                }
//
//                @Override
//                public boolean shouldFilter() {
//                    return true;
//                }
//
//                @Override
//                public Object run() {
//                    System.out.println("running javaPostFilter");
//                    System.out.println(RequestContext.getCurrentContext().get("name").toString());
//                    return null;
//                }
//
//            });
//
//        }
//
//    }
//
//    @Bean
//    public ServletRegistrationBean zuulServlet() {
//        ServletRegistrationBean servlet = new ServletRegistrationBean(new ZuulServlet());
//        servlet.addUrlMappings("/test");
//        return servlet;
//    }
//
//    @Bean
//    public FilterRegistrationBean contextLifecycleFilter() {
//        FilterRegistrationBean filter = new FilterRegistrationBean(new ContextLifecycleFilter());
//        filter.addUrlPatterns("/*");
//        return filter;
//    }
}
